from __future__ import annotations
import json


class Select:
    def __init__(self, game_list_path: str = "Functions/data/GameList.json", all_game_forums_path: str = "Functions/data/AllGameForums.json"):
        """
        初始化 Select 类，读取游戏列表和所有游戏论坛的数据。

        :param game_list_path: 游戏列表 JSON 文件的路径，默认为 "../data/GameList.json"
        :param all_game_forums_path: 所有游戏论坛 JSON 文件的路径，默认为 "../data/AllGameForums.json"
        """
        self.GameList = self._load_json_file(game_list_path)
        self.AllGameForums = self._load_json_file(all_game_forums_path)

    def _load_json_file(self, file_path: str) -> dict:
        """
        加载 JSON 文件并返回解析后的数据。

        :param file_path: JSON 文件的路径
        :return: 解析后的 JSON 数据，如果出现错误则返回空字典
        """
        try:
            with open(file_path, "r", encoding="utf-8") as f:
                return json.load(f)
        except FileNotFoundError:
            print(f"Error: File {file_path} not found.")
        except json.JSONDecodeError:
            print(f"Error: Failed to decode file {file_path}.")
        return {}

    def _find_game_data(self, game_name: str) -> dict | None:
        """
        根据游戏名称查找游戏数据。

        :param game_name: 游戏名称
        :return: 游戏数据字典，如果未找到则返回 None
        """
        for game in self.GameList.get("data", {}).get("list", []):
            if game["name"] == game_name:
                return game
        return None

    def _get_game_id(self, game_name: str) -> int | None:
        """
        内部方法：根据游戏名称获取游戏 ID。

        :param game_name: 游戏名称
        :return: 游戏 ID，如果未找到则返回 None
        """
        game = self._find_game_data(game_name)
        return game.get("id") if game else None

    def get_game_id(self, game_name: str | None = None, game_id: int = 0) -> int | None:
        """
        根据游戏名称或已有的游戏 ID 获取游戏 ID。

        :param game_name: 游戏名称，默认为 None
        :param game_id: 已有的游戏 ID，默认为 0
        :return: 游戏 ID，如果未找到则返回 None
        """
        return game_id if game_id else self._get_game_id(game_name)

    def get_game_data(self, game_name: str) -> dict | None:
        """
        根据游戏名称获取游戏数据。

        :param game_name: 游戏名称
        :return: 游戏数据字典，如果未找到则返回 None
        """
        return self._find_game_data(game_name)

    def get_game_name(self, game_name: str) -> str | None:
        """
        根据游戏名称获取游戏名称。

        :param game_name: 游戏名称
        :return: 游戏名称，如果未找到则返回 None
        """
        game = self._find_game_data(game_name)
        return game.get("name") if game else None

    def get_game_en_name(self, game_name: str) -> str | None:
        """
        根据游戏名称获取游戏的英文名称。

        :param game_name: 游戏名称
        :return: 游戏的英文名称，如果未找到则返回 None
        """
        game = self._find_game_data(game_name)
        return game.get("en_name") if game else None

    def _get_game_forums(self, game_id: int) -> dict | None:
        """
        内部方法：根据游戏 ID 获取游戏的论坛数据。

        :param game_id: 游戏 ID
        :return: 游戏论坛数据字典，如果未找到则返回 None
        """
        for forum in self.AllGameForums.get("data", {}).get("list", []):
            if forum["game_id"] == game_id:
                return forum
        return None

    def get_game_forums(self, game_name: str | None = None, game_id: int = 0) -> dict | None:
        """
        根据游戏名称或游戏 ID 获取游戏的论坛数据。

        :param game_name: 游戏名称，默认为 None
        :param game_id: 游戏 ID，默认为 0
        :return: 游戏论坛数据字典，如果未找到则返回 None
        """
        game_id = self.get_game_id(game_name, game_id)
        return self._get_game_forums(game_id) if game_id else None

    def _get_forum(self, forum_name: str, game_forums: dict) -> dict | None:
        """
        内部方法：根据论坛名称和游戏论坛数据获取论坛数据。

        :param forum_name: 论坛名称
        :param game_forums: 游戏论坛数据
        :return: 论坛数据字典，如果未找到则返回 None
        """
        for forum in game_forums["forums"]:
            if forum["name"] == forum_name:
                return forum
        return None

    def get_forum(self, forum_name: str, game_name: str | None = None, game_id: int = 0) -> dict | None:
        """
        根据论坛名称、游戏名称或游戏 ID 获取论坛数据。

        :param forum_name: 论坛名称
        :param game_name: 游戏名称，默认为 None
        :param game_id: 游戏 ID，默认为 0
        :return: 论坛数据字典，如果未找到则返回 None
        """
        game_forums = self.get_game_forums(game_name, game_id)
        return self._get_forum(forum_name, game_forums) if game_forums else None

    def get_forum_id(self, forum_name: str, game_name: str | None = None, game_id: int = 0) -> int | None:
        """
        根据论坛名称、游戏名称或游戏 ID 获取论坛 ID。

        :param forum_name: 论坛名称
        :param game_name: 游戏名称，默认为 None
        :param game_id: 游戏 ID，默认为 0
        :return: 论坛 ID，如果未找到则返回 None
        """
        forum = self.get_forum(forum_name, game_name, game_id)
        return forum.get("id") if forum else None

    def get_forum_cate_id(self, forum_name: str, forum_cate_name: str = "", video_cate_name: str = "", game_name: str | None = None, game_id: int = 0) -> int | None:
        """
        根据论坛名称、分类名称、游戏名称或游戏 ID 获取论坛分类 ID。

        :param forum_name: 论坛名称
        :param forum_cate_name: 论坛分类名称，默认为空字符串
        :param video_cate_name: 视频分类名称，默认为空字符串
        :param game_name: 游戏名称，默认为 None
        :param game_id: 游戏 ID，默认为 0
        :return: 论坛分类 ID，如果未找到则返回 None
        """
        forum = self.get_forum(forum_name, game_name, game_id)
        if not forum:
            return None
        key_name = forum_cate_name if forum_cate_name else video_cate_name
        if not key_name:
            print("Error: No category name provided.")
            return None
        cate_list = forum["forum_cate_list"] if forum_cate_name else forum["video_cate_list"]
        for cate in cate_list:
            if cate["name"] == key_name:
                return cate["id"]
        return None


if __name__ == "__main__":
    select = Select()
    game_name = "绝区零"
    forum_name = "同人图"
    forum_cate_name = "手作·绘画"
    forum_id = select.get_forum_cate_id(game_name=game_name, forum_name=forum_name, forum_cate_name=forum_cate_name)
    print(forum_id)
